package com.xxgc.demo.controller.aop;

import com.xxgc.demo.controller.error.myerror.IdCardDateException;
import com.xxgc.demo.controller.vo.NameAuthenticationOV;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @Author:SJY
 * @Date :2023/9/12 - 09 - 12 - 11:49
 * 用户身份证时间校验
 */
@Component
@Aspect
public class UserIdCardDateAOP {

    //参数校验是在AOP的前面
    //ProceedingJoinPoint 只能和 @Around 一起用
    @Around("execution(* com.xxgc.demo.controller.UserLoginController.realNameAuthentication(..))")
    public Object idCardDate(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        //调用方法或实例化对象后面加.var 自动生成前面
        //获取拦截的方法中所有的参数
        Object[] args = proceedingJoinPoint.getArgs();
        //获取参数
        NameAuthenticationOV arg = (NameAuthenticationOV)args[0];
        //获取身份证号
        //510122202510221040
        String idCard = arg.getIdCard();
        //截取身份证号的年月日
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
        Date idCardDate = format.parse(idCard.substring(6, 14)); // 截取身份证号的年月日
        // 判断身份证号是否大于当前时间
        Date currentDate = new Date();
        if (idCardDate.after(currentDate)) {
            //不能拦截 原地报错
            throw new IdCardDateException("","身份证时间不能大于当前时间");
        }

        //环绕放行（大多数情况都放行）
        return proceedingJoinPoint.proceed();
    }

}
